package api;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.User;
import model.UserDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);

        // 登录操作

        // 设置请求的字符集，告诉 servlet 用哪种方式来理解请求
        req.setCharacterEncoding("utf8");

        // 设置响应的编码. 告诉 servlet 按照啥格式来构造响应
        resp.setContentType("text/html; charset=utf8");
        // 1.获取到用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if(username == null || "".equals(username) || password == null || "".equals(password)) {
            String html = "<h3>登陆失败，缺少用户名或者密码 </h3>";
            resp.getWriter().write(html);
            return;
        }
        // 2. 读数据库, 看看用户名是否存在, 并且密码是否匹配
        UserDao userDao = new UserDao();
        User user = userDao.selectByUsername(username);
        if(user == null) {
            // 输入了用户名和密码，但是没有这个用户
            String html = "<h3>登陆失败，用户名或者密码错误</h3>";
            resp.getWriter().write(html);
            return;
        }
        if(!password.equals(user.getPassword())){
            // 用户存在，但是输入的密码不对
            String html = "<h3>登陆失败，用户名或者密码错误</h3>";
            resp.getWriter().write(html);
            return;
        }
        // 3. 用户名密码验证通过, 登录成功, 接下来就创建会话. 使用该会话保存用户信息.
        // 注意参数里面是有 true 的
        //HttpSession session = req.getSession();
        HttpSession session = req.getSession(true);
        // session对象本身也可以当作一个map，来存用户的信息，第一个参数自己定义名字，第二个参数是保存的用户信息
        session.setAttribute("user",user);

        // 4.重定向到 列表页 ， 不是详情页
        //resp.sendRedirect("blog_detail.html");
        resp.sendRedirect("blog_list.html");
    }


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);

        resp.setContentType("application/json;charset=utf8");

        // 使用这个方法来获取到用户的登陆状态
        // 注意里面不要忘记填写参数
//        HttpSession session = req.getSession();
        // 如果用户未登录, 这里的会话就拿不到!!
        HttpSession session = req.getSession(false);
        if(session == null) {
            // 用户未登录
            // 那么就返回一个空的对象
            User user = new User();
            // 需要把java对象转换成 json 的字符串格式
            String strJson = objectMapper.writeValueAsString(user);
            resp.getWriter().write(strJson);
            return;
        }
        // 登录成功
        // 这个需要进行类型转换
        User user = (User) session.getAttribute("user");
        // 在这里也进行一下判断，虽然大概率不会为空
        if(user == null) {
            user = new User();
            // 需要把java对象转换成 json 的字符串格式
            String strJson = objectMapper.writeValueAsString(user);
            resp.getWriter().write(strJson);
            return;
        }
        // 把获取到的对象进行返回到浏览器，前端根据返回的数据进行判断是登录了还是没有登陆，发生跳转
        // 确实成功取出了 user 对象, 就直接返回即可.
        String strJson = objectMapper.writeValueAsString(user);
        resp.getWriter().write(strJson);
    }
}
